package com.shinbada.modules.sys.service;

import com.google.common.collect.Lists;
import com.shinbada.common.utils.CacheUtils;
import com.shinbada.common.utils.StringUtils;
import com.shinbada.core.service.TreeService;
import com.shinbada.modules.sys.entity.Menu;
import com.shinbada.modules.sys.mapper.MenuMapper;
import com.shinbada.modules.sys.utils.LogUtils;
import com.shinbada.modules.sys.utils.UserUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 菜单.
 *
 * @author initcap
 * @version 2016-12-05
 */
@Service
@Transactional(readOnly = true)
public class MenuService extends TreeService<MenuMapper, Menu> {

    @Override
    public Menu get(String id) {
        return super.get(id);
    }

    public List<Menu> findAllMenu() {
        return UserUtils.getMenuList();
    }

    @Override
    public List<Menu> getChildren(String parentId) {
        return super.getChildren(parentId);
    }

    @Transactional(rollbackFor = Exception.class)
    public void saveMenu(Menu menu) {
        // 获取排序号，最末节点排序号+30
        if (StringUtils.isBlank(menu.getId())) {
            List<Menu> list = Lists.newArrayList();
            List<Menu> sourcelist = findAllMenu();
            Menu.sortList(list, sourcelist, menu.getParentId(), false);
            if (CollectionUtils.isNotEmpty(list)) {
                menu.setSort(list.get(list.size() - 1).getSort() + 30);
            }
        }
        // 保存或更新实体
        super.save(menu);
        // 清除用户菜单缓存
        UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
        UserUtils.removeCache(UserUtils.CACHE_TOP_MENU);
        // 清除日志相关缓存
        CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
    }

    @Transactional(rollbackFor = Exception.class)
    public void updateSort(Menu menu) {
        mapper.updateSort(menu);
        // 清除用户菜单缓存
        UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
        UserUtils.removeCache(UserUtils.CACHE_TOP_MENU);
        // 清除日志相关缓存
        CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Menu menu) {
        // 解除菜单角色关联
        List<String> roleMenuIds = mapper.listRoleMenuIdListByMenuId(menu.getId());
        roleMenuIds.forEach(e -> mapper.deleteMenuRole(e));
        // 删除菜单关联的数据权限数据，以及解除角色数据权限关联
        List<String> dataMenuIds = mapper.listDataRuleMenuIdListByMenuId(menu.getId());
        dataMenuIds.forEach(e -> mapper.deleteMenuDataRule(e));
        mapper.delete(menu);
        // 清除用户菜单缓存
        UserUtils.removeCache(UserUtils.CACHE_TOP_MENU);
        UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
        // 清除日志相关缓存
        CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
    }


}
